4 - gdb [ID:16448]
50 von 188 angezeigt

Hier noch eine kurze Einführung in den GDB, dem Debugger, der euch dabei helfen wird,

Fehler in eurem Programm zu identifizieren.

Einmal ganz grob gesagt ist ein Debugger ein Programm, das euch dabei hilft, Fehler in

eurem Programm zu finden, indem ihr den Zustand des Prozesses einfrieren und analysieren könnt.

Ein Debugger lässt dabei zu, dass ihr ein Programm zum Beispiel schrittweise abarbeitet.

Das bedeutet zum Beispiel Quellkodzeile für Quellkodzeile, dass ihr euch anschaut, welchen

Inhalt verschiedene Variablen und Speicheradressen haben und dass ihr diese sogar modifizieren

könnt.

Wenn ein Programm abstürzt, kann man auch einstellen, dass es einen sogenannten Core-Dump

erstellt, dass es ein Speicherbild des Prozesses zu dem Zeitpunkt, als ein Fehler aufgetreten

ist und es abgestürzt ist.

Diese Core-Dumps lassen sich ebenfalls mit einem Debugger analysieren.

Damit solche Core-Dumps angelegt werden, müsste dies zunächst mit Limit in der Shell erlauben.

Um ein Programm, das hier ausführt, sinnvoll zu debuggen, sollten während der Übersetzung

folgende Optionen gesetzt werden.

Wir haben auf der einen Seite das Flag binnenstrich g, mit dem man den Übersetzer dazu anweist,

Debug-Symbole in das Binary zu schreiben.

Die Zugang-Symbole sind zum Beispiel die Übersetzung von Quellquotzeile auf Instruktion, damit

dort eine Zuordnung besteht.

Mit Option binstrich groß o null kann der Übersetzer angewiesen werden, zu wenig wie

möglich zu optimieren.

Das macht es einfacher, ein Programm zu debuggen, weil die tatsächliche Programmausführung

dann näher am Quelltext ist.

Sonst kann es vorkommen, dass der Übersetzer Teile des Programms zum Beispiel weglässt,

wenn er merkt, dass etwas nicht ausgeführt wird.

Dabei muss jedoch beachtet werden, dass mit der Option binstrich groß o das Laufzeitverhalten

beeinflusst werden kann.

Das bedeutet, dass wenn ihr euer Programm normal kompiliert, vielleicht ein Fehler

auftritt.

Wenn ihr das Programm jedoch mit binstrich groß o null kompiliert, der Fehler nicht

mehr auftritt.

In sp verwenden wir den Debugger gdb.

Den könnt ihr ganz einfach verwenden, indem ihr gdb aufruft und als Argument das Programm

angibt, das ihr debuggen wollt.

Der gdb ist dabei rein textbasiert.

Eine halbwegs grafische Oberfläche könnt ihr öffnen, indem ihr cgdb verwendet.

An dieser Stelle wollen wir euch eine kurze praktische Demo mit gdb zeigen.

Wir haben auf der linken Seite eine Quelltext-Datei example.c offen.

Diese möchte ich jetzt kompilieren.

Dazu kann ich zum Beispiel folgendes Make-File verwenden.

Mit make example kann ich nun das Programm kompilieren.

Was dabei auffällt ist, dass ich in den C-Flex die Option binstrich klein g und binstrich

groß o null angegeben habe.

Wenn ich nun versuche das Programm auszuführen, werde ich ein Segmentation-Fault bekommen.

Nun wollen wir die Ursache des Segmentation-Faults suchen und beheben.

Dazu schauen wir nochmal in den Quelltext und werden feststellen, dass wir ohne weiteres

keinen Anhaltspunkt haben, wo wir den Fehler suchen müssen.

Die eine Option die wir haben ist, dass wir den Speicherfehler versuchen mit wallgrind

zu finden.

Dazu kann ich ganz einfach wallgrind mit dem Programm example ausführen.

Teil einer Videoserie :
Teil eines Kapitels:
Freispeicherverwaltung

Zugänglich über

Offener Zugang

Dauer

00:15:00 Min

Aufnahmedatum

2020-05-24

Hochgeladen am

2020-05-25 19:46:24

Sprache

de-DE

Einbetten
Wordpress FAU Plugin
iFrame
Teilen